#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include "palindromo.h"

#define ARQUIVO 	"./arq/wikipedia.txt"
#define ARQ_PALI	"./resultados/wiki_pal.txt"
#define TAM_BUFF 4096

#ifdef TESTE1
	#define TITULO "\nResultado (somente contar os palindromos):\n\n"
#elif defined TESTE2
	#define TITULO "\nResultado (contar os palindromos e calcular os primos):\n\n"
	#define CALCPRIMO
#else
	#define TITULO "\nResultado:\n\n"
	#define CALCPRIMO
	#define SALVAPALI
#endif


char buffer[TAM_BUFF];

int main(){
	int it, lido;
	int palavras, palindromos, primos;
	int iniciop, fimp;
	int pfd;
 	unsigned long t1, t2;
	int plflag;

	#ifdef CALCPRIMO
	int prflag;
	#endif

	#ifdef SALVAPALI
	FILE * pf_pal;
	#endif

	if ((pfd = open(ARQUIVO, O_RDONLY, 0 )) == -1)
	{
	    fprintf(stderr, "Nao foi possivel abrir: %s.\n", ARQUIVO );
	    exit(1);
	}

	#ifdef SALVAPALI
	if ((pf_pal = fopen(ARQ_PALI,"w")) == NULL)
	{
	    fprintf(stderr, "Nao foi possivel abrir: %s.\n", ARQ_PALI );
	    exit(1);
	}
	#endif

	//registra o inicio da execucao
	t1 = clock();

	it = 0;
	palavras = palindromos = primos = 0;

	do{
		lido = read(pfd, (void *) buffer, TAM_BUFF); //le um bloco de texto
		it++;

		//encontra a primeira letra no bloco
		iniciop = 0;
		while(iniciop < lido && (UCASE(buffer[iniciop]) < 'A' ||
				 UCASE(buffer[iniciop]) > 'Z')) iniciop++;

		//busca todas as palavras no bloco de texto
		while(iniciop < lido){

			//encontra o fim da palavra
			fimp = iniciop;
			while(fimp < lido && (UCASE(buffer[fimp]) >= 'A' &&
				  UCASE(buffer[fimp]) <= 'Z')) fimp++;

			if(fimp == TAM_BUFF) break; //fim do bloco

			palavras++;

			//verifica se e palindromo
			plflag = check_palavra( buffer + iniciop, fimp - iniciop);

			if(plflag){
				palindromos++;

				#ifdef CALCPRIMO
				//Sendo palindromo verifica se a soma e primo
				prflag = teste_primo( buffer + iniciop, fimp - iniciop);
				if(prflag) primos++;
				#endif

				#ifdef SALVAPALI
				buffer[fimp] = '\0';
				//salva palindromo
				fprintf(pf_pal, "%s %d\n", buffer + iniciop, prflag);
				#endif
			}

			//encontra o comeco da proxima palavra
			iniciop = fimp;
			while(iniciop < lido && (UCASE(buffer[iniciop]) < 'A' ||
				  UCASE(buffer[iniciop]) > 'Z')) iniciop++;
		}

		//caso tenha cortado alguma palavra volta o cursor do arquivo
		if(fimp == lido)
				lseek(pfd, SEEK_CUR, iniciop - lido);

	}
	while(lido == TAM_BUFF);

	t2 = clock();

	printf(TITULO);
	printf("\tTempo total: %lfs\n", ((double) (t2 - t1))/CLOCKS_PER_SEC);
	printf("\tAcessos ao arquivo: %d\n\tPalavras: %d\n\tPalindromos: %d\n",
		  it, palavras, palindromos);

	#ifdef CALCPRIMO
	printf("\tPrimos: %d\n", primos);
	#endif

	close(pfd);

	#ifdef SALVAPALI
	fclose(pf_pal);
	#endif

	return 0;
}
